#include "../mqserver/mq_message.hpp"
#include <gtest/gtest.h>

bitmq::MessageManager::ptr mmp;
class MessageTest : public testing::Environment
{
    virtual void SetUp() override
    {
        mmp = std::make_shared<bitmq::MessageManager>("./data/message/");
        mmp->initQueueMessage("q1");
    }

    virtual void TearDown() override
    {
        // mmp->clear();
    }
};

// 新增消息测试：新增消息，然后观察可获得消息数量，以及持久化消息数量

// 删除消息测试：确认一条消息，查看持久化消息数量，待确认消息数量
// 销毁测试

// TEST(message_test, insert_test)
// {
//     bitmq::BasicProperties properties;
//     properties.set_id(bitmq::UUIDHelper::uuid());
//     properties.set_delivery_mode(bitmq::DeliveryMode::DURABLE);
//     properties.set_routing_key("news.music.pop");
//     mmp->insert("q1", &properties, "Hello world-1", bitmq::DeliveryMode::DURABLE);
//     mmp->insert("q1", nullptr, "Hello world-2", bitmq::DeliveryMode::DURABLE);
//     mmp->insert("q1", nullptr, "Hello world-3", bitmq::DeliveryMode::DURABLE);
//     mmp->insert("q1", nullptr, "Hello world-4", bitmq::DeliveryMode::DURABLE);
//     mmp->insert("q1", nullptr, "Hello world-5", bitmq::DeliveryMode::UNDURABLE);

//     ASSERT_EQ(mmp->total_count("q1"), 4);
//     ASSERT_EQ(mmp->durable_count("q1"), 4);
//     ASSERT_EQ(mmp->getable_count("q1"), 5);
//     ASSERT_EQ(mmp->waitack_count("q1"), 0);
// }
// 获取消息测试：获取一条消息，然后不进行确认，以及确认后，查看消息数量，以及测试消息获取的顺序
// TEST(message_test, select_test)
// {
//     bitmq::MessagePtr msg1 = mmp->front("q1");
//     ASSERT_NE(msg1.get(), nullptr);
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello world-1"));
//     ASSERT_EQ(mmp->getable_count("q1"), 3);
//     ASSERT_EQ(mmp->waitack_count("q1"), 1);

//     bitmq::MessagePtr msg2 = mmp->front("q1");
//     ASSERT_NE(msg2.get(), nullptr);
//     ASSERT_EQ(msg2->payload().body(), std::string("Hello world-2"));
//     ASSERT_EQ(mmp->getable_count("q1"), 2);
//     ASSERT_EQ(mmp->waitack_count("q1"), 2);

//     bitmq::MessagePtr msg3 = mmp->front("q1");
//     ASSERT_NE(msg3.get(), nullptr);
//     ASSERT_EQ(msg3->payload().body(), std::string("Hello world-3"));
//     ASSERT_EQ(mmp->getable_count("q1"), 1);
//     ASSERT_EQ(mmp->waitack_count("q1"), 3);

//     bitmq::MessagePtr msg4 = mmp->front("q1");
//     ASSERT_NE(msg4.get(), nullptr);
//     ASSERT_EQ(msg4->payload().body(), std::string("Hello world-4"));
//     ASSERT_EQ(mmp->getable_count("q1"), 0);
//     ASSERT_EQ(mmp->waitack_count("q1"), 4);

//     bitmq::MessagePtr msg5 = mmp->front("q1");
//     ASSERT_EQ(msg5.get(), nullptr);
// }

// // 删除测试
// TEST(message_test, delete_test)
// {
//     bitmq::MessagePtr msg1 = mmp->front("q1");
//     ASSERT_NE(msg1.get(), nullptr);
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello world-1"));
//     ASSERT_EQ(mmp->getable_count("q1"), 3);
//     ASSERT_EQ(mmp->waitack_count("q1"), 1);

//     mmp->ack("q1", msg1->payload().properties().id());
//     ASSERT_EQ(mmp->getable_count("q1"), 3);
//     ASSERT_EQ(mmp->waitack_count("q1"), 0);
//     ASSERT_EQ(mmp->durable_count("q1"), 3);
// }
// 销毁测试
TEST(message_test, delete_test)
{
    mmp->destroyQueueMessage("q1");
}
int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new MessageTest);
    int t = RUN_ALL_TESTS();
    return 0;
}